QML进阶(八)实现QML界面与C++类型交互 您所在的位置:网站首页 qml 数据类型 QML进阶(八)实现QML界面与C++类型交互

QML进阶(八)实现QML界面与C++类型交互

2023-07-08 00:49| 来源: 网络整理| 查看: 265

在QML工程中,一般QML界面只负责前端交互,而真正的业务逻辑都是C++模块实现的。为了实现前端和后端的顺利衔接,我们需要做好QML界面与C++的交互。这里就介绍一下如何在QML中调用对应的C++模块。在QML中调用C++模块的方法主要有三种,分别是: 1.设置上下文属性(setContextProperty()) 2.在QML引擎里面注册新类型(qmlRegisterType) 3.导出对应的QML扩展插件。

下面介绍一下三个方法的优缺点: 对于小型应用来说,方法一设置上下文属性是最简单实用的方法。开发者只需要将对应的接口和变量暴露给QML就行。由于设置在QML中的变量是全局的,一定要注意避免名称冲突。

在QML引擎里面注册新的类型,允许用户在QML文件中控制C++对象的生命周期,这是设置上下文属性这种方法无法实现的。同时注册新类型的方法,不会污染全局命名空间。但是这种方法也有一个缺点,就是QML中的类型都需要提前注册,所有用到的库都需要在程序启动的时候链接,无法动态链接。但在绝大多数情况下,这并不是一个问题。

QML扩展插件是弹性最好,但也是最复杂的方法。QML允许用户在插件里面注册对应的新类型。这些新类型在QML第一次导入对应的符号的时候被加载。同时,通过使用QML单例引入,我们的新类型不会污染全局命名空间。由于新类型被插件化了,我们可以很轻松的在多个项目中复用我们之前定义的新类型。 下面分别通过实例介绍一下三种方法的调用过程

1.设置上下文属性(setContextProperty())

首先在QML工程中添加一个C++类FileIO,该类主要负责文件的打开读取和保存。类继承自QObject,导出了QML需要访问的接口和成员变量,代码如下:

123456789101112131415161718192021222324252627282930313233343536373839404142//fileio.h #ifndef FILEIO_H #define FILEIO_H #include //用来打开的保存对应的文件 class FileIO : public QObject {     Q_OBJECT     //定义QML可以访问的属性,定义格式如下     //Q_PROPERTY(变量类型 访问名称 READ 读方法 WRITE 写方法 NOTIFY 发生变化的通知信号)     //需要定义在Q_OBJECT之后第一个public之前     Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)     Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)     //ui_title是在QML使用的别名,m_title_content是对应的变量名称     //CONSTANT说明是只读的     Q_PROPERTY(QString ui_title MEMBER m_title_content CONSTANT) public:     FileIO(QObject *parent = 0);     ~FileIO();     //定义QML可以访问的方法     Q_INVOKABLE void read();     Q_INVOKABLE void write();     QUrl source() const;     QString text() const; public slots:     void setSource(QUrl source);     void setText(QString text); signals:     void sourceChanged(QUrl arg);     void textChanged(QString arg); private:     QUrl m_file_source;     QString m_file_content;     //用来测试的只读title数据     QString m_title_content; }; #endif // FILEIO_H 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667//fileio.cpp #include "fileio.h" FileIO::FileIO(QObject *parent)     : QObject(parent),       m_title_content(QString("fileio")) { } FileIO::~FileIO() { } void FileIO::read() {     if(m_file_source.isEmpty()) {         return;     }     QFile file(m_file_source.toLocalFile());     if(!file.exists()) {         qWarning()


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有